'''
图标 - 右键 - 打开文件所在位置 - 选择 app-10.18.10 - 打开 postman.exe

1、介绍：
      postman是一款非常流行的接口调试工具
2、特征：
      简单易用的图形用户界面
      可以保存接口请求的历史记录
      使用测试集Collections可以更有效的管理组织接口
      在团队之间同步接口数据
3、安装：
     ① 安装 postman ：https://www.postman.com/downloads/
     ② 安装 newman 插件
           11、先确保是否安装node.js：
                               终端：npm -v
               node.js安装网址：https://nodejs.org/zh-c
           12、安装 newman：
                      终端：npm install -g newman
                           newman -v 检查newman是否安装成功
           13、安装 newman-reporter-html：
                      终端：npm install -g newman-reporter-html
4、案例：
        没有API文档时，可以借助 F12浏览器开发者工具、fiddler 获取请求报文相关数据

     ① 使用 postman 发送 http 请求，访问 tpshop 商城的 "搜索" 接口
           +
           请求方法：GET
           URL：    https://hmshop-test.itheima.net/Home/Goods/search.html?q=%E5%B0%8F%E7%B1%B3
           请求头：无
           请求体：无
           点击 send - Preview查看
           返回数据：html网页

     ② 使用 postman 向 tpshop 商城的 "登录" 接口发送一个密码错误的登录请求
           +
           请求方法：POST
           URL：    http://tpshop-test.itheima.net/index.php?m=Home&c=user&a=do_login&t=0.6693319
           Headers：
                  key:     Content-Type
                  value:   application/x-www-form-urlencoded
           Body：
                 选择：x-www-form-urlencoded
                 key:    username       password      verify_code
                 value:  13812345678    1234569999    8888
           点击 send - Body查看
           返回数据：{"status":-2,"msg":"密码错误！"}  -实际返回结果“验证码错误”，与业务有关，后续课程会讲
     ③ 从接口文档，获取登录接口的 http请求，使用 postman 发送
           +
           请求方法：POST
           URL：    http://ihrm-test.itheima.net/api/sys/login
           Headers：
                  key:     Content-Type
                  value:   application/json
           Body：
                 {
                      "mobile": "13000000002",
                      "password": "123456"
                 }                                    - 可以点右侧的 Beautify， 让请求体结构更美观
           点击 send - Body - JSON
           返回数据："状态码:200
                    {
                       "success"":true,
                       "code":10000,
                       "message":"操作成功！",
                       "data":"f5050a1b-7919-444c-9ec4-3c1a7266536d"     -data的值是变化的，只要格式正确即可
                    }
5、创建用例集：
      My Workspace - Collections - "+" - create new collection  （documentation：简单描述用例集）
  创建请求：   Add request
  创建模块：   Add folder
  导出用例集   用例集右侧 。。。 - Export   （第一个用例集.postman_collection.json）
  导入用例集   My Workspace import - files - 选择 - import - import as copy

6、postman
     11、介绍：借助 JavaScript -js 语言编写代码，自动判断预期结果与实际结果是否一致
             断言代码写在 Tests 的标签中
     12、常用断言：
           ** ① 断言响应状态码：
                    Tests标签中 - 点击：Status code: Code is 200

                    生成：   pm.test("断言响应状态码为200", function () {          pm       代表postman的一个实例
                               pm.response.to.have.status(200);               test()   是pm实例的一个方法，有两个参数
                           });                                                             参数1 - 在断言结束后，给出的文字提示，可以修改
                                                                                           参数2 - 匿名函数 function (){}
                                                                              pm.response.to.have.status(200)  postman的响应结果中应该包含状态码 200
                    查看结果：Test Results
                             断言成功：pass Status code is 200
                             断言失败：fail

              ② 断言响应体是否包含指定的字符串
                    Tests标签中 - 点击：Response body: Contains string

                    生成：   pm.test("断言响应体包含"操作成功"", function () {                 参数1 - 断言后显示的文字提示信息，可以修改
                               pm.expect(pm.response.text()).to.include("操作成功！");      pm期望响应文本中，包含xxx字符串
                           });
              ③ 断言响应体是否等于某个字符串（对象）
                    Tests标签中 - 点击：Response body: is equal to a string

                    生成： pm.test("Body is correct", function () {
                             pm.response.to.have.body(
                                {
                                    username: "admin",
                                    password: "123456"
                                });
                          });
           ** ④ 断言JSON数据
                    Tests标签中 - 点击：Response body: JSON value check

                    生成： pm.test("断言响应结果username的值为admin", function () {
                             var jsonData = pm.response.json();            用 js 语法定义一个变量，jsonData 是变量名     等号后，代表整个json类型响应体
                             pm.expect(jsonData.username).to.eql("admin");        pm 预期 json 结果为username值等于admin
                         });
              ⑤ 断言响应头
                    Tests标签中 - 点击：Response headers: Content-Type header check

                    生成： pm.test("Content-Type is present", function () {
                              pm.response.to.have.header("Content-Type",
                              "application/json;charset=UTF-8");
                          });
     13、全局变量和环境变量：
           概念：
               全局变量：在postman全局生效的变量，是全局唯一的，不可重复定义
               环境变量：在特定环境下，生效的变量
                       一个变量只属于某个环境，在一个环境里不可重复定义
                       环境和环境之间可以定义重复的变量
                       一个环境可包含多个环境变量
                       常见分类：开发环境。测试环境、生产环境
           设置变量：
               全局变量：
                      手动设置
                      代码设置： pm.globals.set("username", "admin");
               环境变量：
                      手动设置
                      代码设置： pm.environment.set("username", "admin");
           获取变量值：
               全局变量：
                      请求参数中获取 - postman界面： {{username}}
                      代码中获取：                  var username = pm.globals.get("username");
               环境变量：
                      请求参数中获取 - postman界面：  {{username}}
                      代码中获取：                   var username = pm.environment.get("username");
     14、请求前置脚本：
                  在send按钮点击后，请求前置脚本代码，第一时间被执行。在postman内部实际发送http请求之前
     15、时间戳：
             对应绝对时间，从1970年1月1日00：00：00到现在所经历的秒数
        案例：
             调用百度页面接口，传时间戳给服务器
                注意：
                     不能在 test 中写时间戳代码，因为 断言 是在返回http响应之后才执行，而题目是想要在调用接口时，发送请求之前，就拿到时间戳
                操作：
                   ① add_request
                         GET   http://www.baidu.com
                   ② Re_request Script （请求前置脚本）中，添加代码：
                          //拿到时间戳的数据值
                              var timestamp = new Date().getTime()
                          //将时间戳设置到全局变量中
                              pm.globals.set("glb_timestamp", timestamp)
                   ③ 点击 send，发送请求
                   ④ 查看结果：
                            点击右上角 - Environment quick look
                   ⑤ 在postman页面请求参数中添加变量
                         Params 中添加：
                            key：  t
                            value：{{glb_timestamp}}
                   ⑥ 点击 send，发送请求
                   ⑦ 左上角 "+"   - View - show Postman Console  - 可以 clear 先清空  - 最小化窗口 - 再 send 一下
                         结果：GET http://www.baidu.com/?t=1723793738618
     16、postman关联：
            111、介绍：
                    应用于多个http请求之间，有数据关联，或依赖关系时
            112、步骤：  （A接口依赖B接口的数据）
                    向B接口发送http请求，获取数据
                    将数据设置到全局变量（环境变量）中
                    A接口获取全局变量（环境变量）中数据值，进行使用
            113、案例：
                    请求获取天气接口，提取响应结果中的城市，将 城市名 给百度搜索接口使用
                       ① 创建用例集 postman关联，创建天气和百度请求
                       ② 获取天气接口：add_request - http://www.weather.com.cn/data/sk/101010100.html
                             Tests/Post_response 中提取城市名，设置全局变量：
                                 // 获取全部响应结果
                                       var jsonData = pm.response.json()
                                 // 从响应结果中，获取城市名
                                       var city = jsonData.weatherinfo.city
                                 //将城市名写入全局变量中
                                       pm.globals.set("glb_city",city)
                                 点击 send - Environment... - 查看全局变量和全局变量值

                       ③ 百度搜索接口：add_request - http://www.baidu.com/s?wd=手机
                            Params 中调用全局变量：
                                 key：   wd（不能修改，百度自带的搜索关键字）
                                 value： {{glb_city}}
                                 点击 send - Body（Preview） - 查看结果
     17、批量执行测试用例：
            111、创建用例集-批量执行测试用例
            112、添加多个用例
            113、点击这个用例集 - run - 生成 Runner -自动选中http请求
                   Iterations：迭代次数（重复运行一组请求的次数）
                   Delay：     请求之间的时间间隔
                   Data：      引入的外部文件
            114点击 Run 批量执行测试用例
     18、postman测试报告： - 前提：安装 newman
            111、批量执行测试用例
            112、导出用例集数据
            113、在文件所在路径中，进入cmd端口：
                    // 完整的命令：
                           newman run demo.postman_collection.json -e 环境变量  -d 外部数据文件 -r html --reporter-html-export report.html
                    // 终端测试：
                           newman run demo.postman_collection.json
                    // 如果添加 -r html 就报错，说明 newman-reporter-html 安装失败
     19、postman读取外部数据文件（参数化）：
            111、介绍：
                    当 http请求使用的数据有较高相似度，且请求相同时，考虑使用参数化 - 将数据组织到数据文件中
            112、数据文件：
                    CSV：
                       优点：数据组织形式简单，适用于大量数据的场合
                       缺点：不支持 bool 类型数据（数据被postman读入后，自动添加 "" 包裹bool值
                            不支持多参、少参、无参、错误参数的接口测试
                            不支持复杂数据类型（嵌套字典、列表等）
                    JSON：
                       优点：支持 bool 类型数据
                            支持多参、少参、无参、错误参数
                            支持复杂数据类型
                       缺点：对于相同的数据量，JSON 数据文件大小远大于 CSV 文件
            113、导入外部数据文件：
                    CSV：
                        11、创建xxx.csv文件
                               新建文件夹：测试用例参数化
                               新建测试csv文件.txt，并修改后缀为.csv
                               右键 - 打开方式 - 记事本 - 添加数据 （第一行，写入数据对应的字段名
                                                                第二行及后，依次写入对应的数值，用英文逗号隔分）
                               另存为 - 编码：UTF-8
                        12、在postman中，选中使用数据文件的用例集，导入数据文件
                               新建测试用例集
                               新建请求：https://ihrm-java.itheima.net/#/login
                               选中测试用例集 - run - Data（select file） - preview（查看读取后的数据）
                    JSON：
                        11、创建xxx.json文件
                               新建文件夹：测试用例参数化
                               新建测试json文件.txt，并修改后缀为.json
                               右键 - 打开方式 - 记事本 - 添加数据 （postman要求：最外层为 []，内部数据用 {} ）  - 可以使用 json.cn 在线网站编写
                               另存为 - 编码：UTF-8
                        12、在postman中，选中使用数据文件的用例集，导入数据文件
                               新建测试用例集
                               新建请求：https://ihrm-java.itheima.net/#/login
                               选中测试用例集 - run - Data（select file） - preview（查看读取后的数据）
                                    特性：postman 会循环，一行一行读取 {} 中的数据
                                         建议无论是否为字符串，都可以用 "" 包裹 value 的值
            114、获取数据文件中数据的方法：
                    ① 请求参数（请求行、请求头、请求体）中，使用数据文件中的数据
                          使用 {{}} 包裹 csv 中的字段名，或 json 中的 key
                          如：{{username}}
                    ② 代码（断言、请求前置脚本）中，使用数据文件的数据
                          需要借助 postman 提供的关键字 data.字段名，或 data.key
                          如：data.username
            115、案例：批量查询手机号归属地、所属运营商，校验运营商数据正确性
                    运营商接口：
                         接口：http://cx.shouji.360.cn/phonearea.php?number=13012345678
                         params: number  {{file_mobile}}
                         post-response: pm.test("断言归属地", function () {
                                           var jsonData = pm.response.json();
                                           pm.expect(jsonData.data.sp).to.eql(pm.iterationData.get("file_sp"));
                                        });
                    runner:
                         选中数据文件
                         run
            116、数据驱动：
                       借助数据文件，就可以实现数据驱动 - 有多少条数据，对应就有多少个 http 请求




















'''
